#pragma once

#include "Event.h"

namespace network {

    class Reactor;

    class IOMultiplexer {

    public:

        /**
          * @brief  向多路复用模型中添加关心的事件
          * @note   纯虚函数需要重写
          * @param  fd    套接字描述符
          * @param  event 关心的事件
          * @retval 是否添加成功
          */
        virtual bool add(int fd, EventType event) = 0;

        /**
          * @brief  修改多路复用模型中关心的事件
          * @note   纯虚函数需要重写
          * @param  fd    套接字描述符
          * @param  event 关心的事件
          * @retval 是否修改成功
          */
        virtual bool mod(int fd, EventType event) = 0;

        /**
          * @brief  删除多路复用模型对指定fd的任何事件的关心
          * @note   纯虚函数需要重写
          * @param  fd 要删除的fd
          * @retval 是否删除成功
          */
        virtual bool del(int fd) = 0;

        /**
          * @brief  让多路复用器进行事件检测与分发
          * @note   纯虚函数需要重写
          * @param  reactor 将事件分发到的反应堆模型的指针
          * @retval 需要处理的事件数量
          */
        virtual int dispatch(Reactor *reactor) = 0;

        virtual ~IOMultiplexer() = default;

    };

}
